package org.xyq.singleton.lazy;

/**
 * @author xuyanqing
 * @description 1.单例模式-懒汉式（线程不安全）
 * <p>
 * 原理：在第一次调用 getInstance() 时创建实例，实现延迟加载。但在多线程环境下存在竞争条件，可能会创建多个实例。
 * <p>
 * 问题与风险：在多线程场景下，两个线程可能同时判断 instance == null，从而各自创建一个实例，违背了单例原则。
 * <p>
 * @date 2025-02-14 15:23
 * @creed where there is a will,there is a way. yx
 */

public class ThreadUnsafe {

    // 延迟加载实例
    private static ThreadUnsafe instance;

    private ThreadUnsafe() {
    }

    public static ThreadUnsafe getInstance() {
        if (instance == null) {
            // 多线程环境下可能出现问题
            instance = new ThreadUnsafe();
        }
        return instance;
    }

    /**
     * 多线程环境下测试，线程不安全的情况
     * 创建100个线程，每个线程都会访问一个共享的ThreadUnsafe实例
     * 这个方法展示了在多线程环境下，如果不使用适当的同步机制，可能会导致不可预测的行为
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            // 启动一个新的线程
            new Thread(() -> {
                try {
                    // 模拟一些耗时操作，比如IO操作等
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    // 打印异常信息
                    e.printStackTrace();
                }
                // 打印ThreadUnsafe实例的哈希码，用于观察是否每次都是相同的实例
                System.out.println(ThreadUnsafe.getInstance().hashCode());
            }).start();
        }
    }
}
